Date: Sat May 25 04:38:14 2019
Scientist: Ran Yin
Sequencing (Waksman): Dibyendu Kumar
Statistics: Davit Sargsyan
Principal Investigator: Ah-Ng Kong

# sink(file = "tmp/log_nrf2ubiome_data_visualization_may2019_v1.Rmd.txt")
# date()
options(scipen=999)
require(knitr)
Loading required package: knitr
require(kableExtra)
Loading required package: kableExtra
# # Increase mmemory size to 64 Gb----
# invisible(utils::memory.limit(65536))
options(stringsAsFactors = FALSE)
# str(knitr::opts_chunk$get())
# # NOTE: the below does not work!
# knitr::opts_chunk$set(echo = FALSE, 
#                       message = FALSE,
#                       warning = FALSE,
#                       error = FALSE)
# On Windows set multithread=FALSE----
mt <- TRUE
require(data.table)
Loading required package: data.table
data.table 1.12.2 using 18 threads (see ?getDTthreads).  Latest news: r-datatable.com
require(phyloseq)
Loading required package: phyloseq
require(ggplot2)
Loading required package: ggplot2
require(plotly)
Loading required package: plotly

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
# require(data.table)
require(DT)
Loading required package: DT
require(shiny)
Loading required package: shiny

Attaching package: ‘shiny’

The following objects are masked from ‘package:DT’:

    dataTableOutput, renderDataTable
source("source/functions_may2019.R")
# Load data----
# Counts
load("data_may2019/ps_may2019.RData")
# Taxonomy
load("data_may2019/taxa.RData")
taxa <- data.table(seq16s = rownames(taxa),
                   taxa)
# Samples
samples <- ps_may2019@sam_data
DT::datatable(samples,
              options = list(pageLength = nrow(samples)))

Taxonomic Ranks:

King Phillip Can nOt Find Green Socks

  • Kingdom
  • Phylum
  • Class
  • Order
  • Family
  • Genus
  • Species

Prune data

Check mapping.


 Bacteria Eukaryota      <NA> 
     7994       116        19 

     Acidobacteria     Actinobacteria      Bacteroidetes      Cyanobacteria    Deferribacteres 
                 3                177               2102                 31                 10 
Epsilonbacteraeota         Firmicutes       Fusobacteria        Parabasalia    Patescibacteria 
                27               4997                  1                  1                 63 
    Planctomycetes     Proteobacteria        Tenericutes    Verrucomicrobia               <NA> 
                 1                202                 84                 66                364 

First, all OTUs that were not bacteria were removed. Also, OTUs that were not mapped to a phylum were removed as these are usually sequencing artifacts.


Bacteria 
    7764 

     Acidobacteria     Actinobacteria      Bacteroidetes      Cyanobacteria    Deferribacteres 
                 3                177               2102                 31                 10 
Epsilonbacteraeota         Firmicutes       Fusobacteria    Patescibacteria     Planctomycetes 
                27               4997                  1                 63                  1 
    Proteobacteria        Tenericutes    Verrucomicrobia 
               202                 84                 66 

Richness (Alpha diversity)

OTU table

Total counts per sample (i.e. sequencing depth)

Counts at Phylum level

Relative abundance (%) at Phylum level

Remove phyla with relative abundance of >= 1% in less than 10% of samples (i.e. prevalence >= 10%).

Hence, only 6 out of 13 Phyla were studied in this analysis: Actinobacteria, Bacteroidetes, Firmicutes, Proteobacteria, Tenericutes and Verrucomicrobia. Relative abundance at the next taxonomic level (Class) was, therefore, computed relative to the sum of these 6 Phyla.

[1] "Actinobacteria"  "Bacteroidetes"   "Firmicutes"      "Proteobacteria"  "Tenericutes"    
[6] "Verrucomicrobia"

7,628 OTUs, down from 7,764 OTUs in the previous table.

Relative Abundance in Samples at Different Taxonomic Ranks

1. Class

Session Information

sessionInfo()
R version 3.5.0 (2018-04-23)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: Red Hat Enterprise Linux Server 7.5 (Maipo)

Matrix products: default
BLAS/LAPACK: /usr/lib64/R/lib/libRblas.so

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8       
 [4] LC_COLLATE=en_US.UTF-8     LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                  LC_ADDRESS=C              
[10] LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] shiny_1.3.2       DT_0.6            plotly_4.9.0      ggplot2_3.1.1     phyloseq_1.26.1  
[6] data.table_1.12.2 kableExtra_1.1.0  knitr_1.23       

loaded via a namespace (and not attached):
 [1] Biobase_2.42.0      httr_1.4.0          tidyr_0.8.3         jsonlite_1.6        viridisLite_0.3.0  
 [6] splines_3.5.0       foreach_1.4.4       assertthat_0.2.1    stats4_3.5.0        yaml_2.2.0         
[11] pillar_1.4.0        lattice_0.20-35     glue_1.3.1          digest_0.6.19       promises_1.0.1     
[16] XVector_0.22.0      rvest_0.3.4         colorspace_1.4-1    httpuv_1.5.1        htmltools_0.3.6    
[21] Matrix_1.2-14       plyr_1.8.4          pkgconfig_2.0.2     zlibbioc_1.28.0     xtable_1.8-4       
[26] purrr_0.3.2         scales_1.0.0        webshot_0.5.1       later_0.8.0         tibble_2.1.1       
[31] mgcv_1.8-23         IRanges_2.16.0      withr_2.1.2         BiocGenerics_0.28.0 lazyeval_0.2.2     
[36] mime_0.6            survival_2.41-3     magrittr_1.5        crayon_1.3.4        evaluate_0.13      
[41] nlme_3.1-137        MASS_7.3-49         xml2_1.2.0          vegan_2.5-5         tools_3.5.0        
[46] hms_0.4.2           stringr_1.4.0       Rhdf5lib_1.4.3      S4Vectors_0.20.1    munsell_0.5.0      
[51] cluster_2.0.7-1     Biostrings_2.50.2   ade4_1.7-13         compiler_3.5.0      rlang_0.3.4        
[56] rhdf5_2.26.2        grid_3.5.0          iterators_1.0.10    biomformat_1.10.1   rstudioapi_0.10    
[61] htmlwidgets_1.3     crosstalk_1.0.0     igraph_1.2.4.1      labeling_0.3        rmarkdown_1.12     
[66] gtable_0.3.0        codetools_0.2-15    multtest_2.38.0     reshape2_1.4.3      R6_2.4.0           
[71] dplyr_0.8.1         permute_0.9-5       readr_1.3.1         ape_5.3             stringi_1.4.3      
[76] parallel_3.5.0      Rcpp_1.0.1          tidyselect_0.2.5    xfun_0.7           
LS0tCnRpdGxlOiAiTnJmMiBCTDYgUEVJVEMgMTZTIE1pY3JvYmlvbWUgRGF0YSBWaXN1YWxpemF0aW9uIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKLS0tCkRhdGU6IGByIGRhdGUoKWAgICAgIApTY2llbnRpc3Q6IFtSYW4gWWluXShtYWlsdG86cnkxNDdAc2NhcmxldG1haWwucnV0Z2Vycy5lZHUpICAgICAgClNlcXVlbmNpbmcgKFdha3NtYW4pOiBbRGlieWVuZHUgS3VtYXJdKG1haWx0bzpka0B3YWtzbWFuLnJ1dGdlcnMuZWR1KSAgICAgIApTdGF0aXN0aWNzOiBbRGF2aXQgU2FyZ3N5YW5dKG1haWx0bzpzYXJnZGF2aWRAZ21haWwuY29tKSAgICAgIApQcmluY2lwYWwgSW52ZXN0aWdhdG9yOiBbQWgtTmcgS29uZ10obWFpbHRvOmtvbmd0QHBoYXJtYWN5LnJ1dGdlcnMuZWR1KSAKCmBgYHtyIGhlYWRlcn0KIyBzaW5rKGZpbGUgPSAidG1wL2xvZ19ucmYydWJpb21lX2RhdGFfdmlzdWFsaXphdGlvbl9tYXkyMDE5X3YxLlJtZC50eHQiKQojIGRhdGUoKQpvcHRpb25zKHNjaXBlbj05OTkpCgpyZXF1aXJlKGtuaXRyKQpyZXF1aXJlKGthYmxlRXh0cmEpCgojICMgSW5jcmVhc2UgbW1lbW9yeSBzaXplIHRvIDY0IEdiLS0tLQojIGludmlzaWJsZSh1dGlsczo6bWVtb3J5LmxpbWl0KDY1NTM2KSkKb3B0aW9ucyhzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiMgc3RyKGtuaXRyOjpvcHRzX2NodW5rJGdldCgpKQojICMgTk9URTogdGhlIGJlbG93IGRvZXMgbm90IHdvcmshCiMga25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgCiMgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwKIyAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLAojICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEZBTFNFKQoKIyBPbiBXaW5kb3dzIHNldCBtdWx0aXRocmVhZD1GQUxTRS0tLS0KbXQgPC0gVFJVRQoKcmVxdWlyZShkYXRhLnRhYmxlKQpyZXF1aXJlKHBoeWxvc2VxKQpyZXF1aXJlKGdncGxvdDIpCnJlcXVpcmUocGxvdGx5KQojIHJlcXVpcmUoZGF0YS50YWJsZSkKcmVxdWlyZShEVCkKcmVxdWlyZShzaGlueSkKc291cmNlKCJzb3VyY2UvZnVuY3Rpb25zX21heTIwMTkuUiIpCgojIExvYWQgZGF0YS0tLS0KIyBDb3VudHMKbG9hZCgiZGF0YV9tYXkyMDE5L3BzX21heTIwMTkuUkRhdGEiKQoKIyBUYXhvbm9teQpsb2FkKCJkYXRhX21heTIwMTkvdGF4YS5SRGF0YSIpCnRheGEgPC0gZGF0YS50YWJsZShzZXExNnMgPSByb3duYW1lcyh0YXhhKSwKICAgICAgICAgICAgICAgICAgIHRheGEpCgojIFNhbXBsZXMKc2FtcGxlcyA8LSBwc19tYXkyMDE5QHNhbV9kYXRhCkRUOjpkYXRhdGFibGUoc2FtcGxlcywKICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gbnJvdyhzYW1wbGVzKSkpCmBgYAoKIyMjIFRheG9ub21pYyBSYW5rczoKIyMjIyAqKksqKmluZyAqKlAqKmhpbGxpcCAqKkMqKmFuIG4qKk8qKnQgKipGKippbmQgKipHKipyZWVuICoqUyoqb2NrcwoqIEtpbmdkb20gICAgICAgICAgICAgICAgCiogUGh5bHVtICAgICAgICAgICAgICAgICAgICAKKiBDbGFzcyAgICAgICAgICAgICAgICAgICAKKiBPcmRlciAgICAgICAgICAgICAgICAgICAKKiBGYW1pbHkgICAgIAoqIEdlbnVzICAgICAKKiBTcGVjaWVzICAKCiMgUHJ1bmUgZGF0YQpDaGVjayBtYXBwaW5nLgpgYGB7ciBjaGVja19tYXBwaW5nLCB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRX0KdGFibGUodGF4X3RhYmxlKHBzX21heTIwMTkpWywgIktpbmdkb20iXSwgCiAgICAgIGV4Y2x1ZGUgPSBOVUxMKQp0YWJsZSh0YXhfdGFibGUocHNfbWF5MjAxOSlbLCAiUGh5bHVtIl0sIAogICAgICBleGNsdWRlID0gTlVMTCkKYGBgCgpGaXJzdCwgYWxsIE9UVXMgdGhhdCB3ZXJlIG5vdCBiYWN0ZXJpYSB3ZXJlIHJlbW92ZWQuIEFsc28sIE9UVXMgdGhhdCB3ZXJlIG5vdCBtYXBwZWQgdG8gYSBwaHlsdW0gd2VyZSByZW1vdmVkIGFzIHRoZXNlIGFyZSAgdXN1YWxseSBzZXF1ZW5jaW5nIGFydGlmYWN0cy4KYGBge3IgcHJ1bmUsIHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFfQojIDEuIEtlZXAgYmFjdGVyaWEgb25seSAoaS5lLiByZW1vdmUgYXJjaGVhIGFuZCBldWNhcnlvdGEpCiMgMi4gUmVtb3ZlIGlmIHBoeWx1bSBpcyB1bm1hcHBlZApwczAgPC0gc3Vic2V0X3RheGEocHNfbWF5MjAxOSwgCiAgICAgICAgICAgICAgICAgICBLaW5nZG9tID09ICJCYWN0ZXJpYSIgJgogICAgICAgICAgICAgICAgICAgICAhaXMubmEoUGh5bHVtKSkKCnRhYmxlKHRheF90YWJsZShwczApWywgIktpbmdkb20iXSwgCiAgICAgIGV4Y2x1ZGUgPSBOVUxMKQp0YWJsZSh0YXhfdGFibGUocHMwKVssICJQaHlsdW0iXSwgCiAgICAgIGV4Y2x1ZGUgPSBOVUxMKQpgYGAKCiMgUmljaG5lc3MgKEFscGhhIGRpdmVyc2l0eSkKYGBge3IgcmljaG5lc3MsIHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTV9CnBzMEBzYW1fZGF0YSREaWV0X1dlZWsgPC0gcGFzdGUoc2FtcGxlcyRUUkVBVE1FTlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMkV0VFSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gIl8iKQpwczBAc2FtX2RhdGEkSUQgPC0gc3Vic3RyKHggPSBwczBAc2FtX2RhdGEkU0FNUExFX05BTUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCA9IDMpCnAxIDwtIHBsb3RfcmljaG5lc3MocHMwLAogICAgICAgICAgICAgICAgICAgIHggPSAiRGlldF9XZWVrIiwgCiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZXMgPSAiU2hhbm5vbiIsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiSUQiKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IElEKSwKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLAogICAgICAgICAgICAgc2l6ZSA9IDMsCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpCmdncGxvdGx5KHAxKQpgYGAKCiMgT1RVIHRhYmxlCmBgYHtyIG90dV90YWJsZSwgd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0V9Cm90dSA8LSBkYXRhLnRhYmxlKHBzMEB0YXhfdGFibGVALkRhdGEsCiAgICAgICAgICAgICAgICAgIHQocHMwQG90dV90YWJsZUAuRGF0YSkpCkRUOjpkYXRhdGFibGUob3R1KQpgYGAKCiMgVG90YWwgY291bnRzIHBlciBzYW1wbGUgKGkuZS4gc2VxdWVuY2luZyBkZXB0aCkKYGBge3IgVGF4LCB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSxmaWcud2lkdGg9MTAsZmlnLmhlaWdodD01fQp0MSA8LSBjb2xTdW1zKG90dVssIDc6bmNvbChvdHUpXSkKdDEgPC0gZGF0YS50YWJsZShTQU1QTEVfTkFNRSA9IG5hbWVzKHQxKSwKICAgICAgICAgICAgICAgICBUb3RhbCA9IHQxKQoKdG1wIDwtIGRhdGEudGFibGUoU0FNUExFX05BTUUgPSBzYW1wbGVzJFNBTVBMRV9OQU1FLAogICAgICAgICAgICAgICAgICBUUkVBVE1FTlQgPSBzYW1wbGVzJFRSRUFUTUVOVCwKICAgICAgICAgICAgICAgICAgV0VFSyA9IHNhbXBsZXMkV0VFSykKCnQxIDwtIG1lcmdlKHRtcCwKICAgICAgICAgICAgdDEsCiAgICAgICAgICAgIGJ5ID0gIlNBTVBMRV9OQU1FIikKCnAxIDwtIGdncGxvdCh0MSwKICAgICAgICAgICAgIGFlcyh4ID0gU0FNUExFX05BTUUsCiAgICAgICAgICAgICAgICAgeSA9IFRvdGFsLAogICAgICAgICAgICAgICAgIGZpbGwgPSBUUkVBVE1FTlQsCiAgICAgICAgICAgICAgICAgY29sb3VyID0gV0VFSykpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIHNjYWxlX3hfZGlzY3JldGUoIlNhbXBsZSBOYW1lIikgKwogIHNjYWxlX3lfY29udGludW91cygiTnVtYmVyIG9mIFJlYWRzIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUoIkdyb3VwIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxKSkgCmdncGxvdGx5KHAxKQpgYGAKCiMgQ291bnRzIGF0IFBoeWx1bSBsZXZlbApgYGB7ciBjb3VudHNfcCwgd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0V9CmNvdW50c19wIDwtIGNvdW50c19ieV90YXhfcmFuayhkdDEgPSBvdHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyX2J5ID0gIlBoeWx1bSIpCkRUOjpkYXRhdGFibGUoY291bnRzX3AsCiAgICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IG5yb3coY291bnRzX3ApKSkKYGBgCgojIFJlbGF0aXZlIGFidW5kYW5jZSAoJSkgYXQgUGh5bHVtIGxldmVsCmBgYHtyIHJhX3AsIHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFfQpyYV9wIDwtIHJhX2J5X3RheF9yYW5rKGNvdW50cyA9IGNvdW50c19wKQpEVDo6ZGF0YXRhYmxlKHJhX3AsCiAgICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IG5yb3cocmFfcCkpKQpgYGAKClJlbW92ZSBwaHlsYSB3aXRoIHJlbGF0aXZlIGFidW5kYW5jZSBvZiA+PSAxJSBpbiBsZXNzIHRoYW4gMTAlIG9mIHNhbXBsZXMgKGkuZS4gcHJldmFsZW5jZSA+PSAxMCUpLgoKYGBge3IgcHJldl9wLCB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRX0KdDEgPC0gZGF0YS50YWJsZShQaHlsdW0gPSByYV9wJFBoeWx1bSwKICAgICAgICAgICAgICAgICBQcmV2YWxlbmNlID0gcm91bmQoMTAwKnJvd1N1bXMocmFfcFssIDI6bmNvbChyYV9wKV0gPj0gMSkvMzAsIDEpKQpEVDo6ZGF0YXRhYmxlKHQxLAogICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSBucm93KHJhX3ApKSkKYGBgCgpIZW5jZSwgb25seSA2IG91dCBvZiAxMyBQaHlsYSB3ZXJlIHN0dWRpZWQgaW4gdGhpcyBhbmFseXNpczogQWN0aW5vYmFjdGVyaWEsIEJhY3Rlcm9pZGV0ZXMsIEZpcm1pY3V0ZXMsIFByb3Rlb2JhY3RlcmlhLCBUZW5lcmljdXRlcyBhbmQgVmVycnVjb21pY3JvYmlhLiBSZWxhdGl2ZSBhYnVuZGFuY2UgYXQgdGhlIG5leHQgdGF4b25vbWljIGxldmVsIChDbGFzcykgd2FzLCB0aGVyZWZvcmUsIGNvbXB1dGVkIHJlbGF0aXZlIHRvIHRoZSBzdW0gb2YgdGhlc2UgNiBQaHlsYS4KCmBgYHtyIGtlZXBfNl9waHlsYSwgd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0V9CmtlZXBfcCA8LSB0MSRQaHlsdW1bdDEkUHJldmFsZW5jZSA+PSAxMF0Ka2VlcF9wIApwczEgPC0gc3Vic2V0X3RheGEocHMwLCAKICAgICAgICAgICAgICAgICAgIFBoeWx1bSAlaW4lIGtlZXBfcCApCm90dTEgPC0gZGF0YS50YWJsZShwczFAdGF4X3RhYmxlQC5EYXRhLAogICAgICAgICAgICAgICAgICAgdChwczFAb3R1X3RhYmxlQC5EYXRhKSkKRFQ6OmRhdGF0YWJsZShvdHUxKQpgYGAKCjcsNjI4IE9UVXMsIGRvd24gZnJvbSA3LDc2NCBPVFVzIGluIHRoZSBwcmV2aW91cyB0YWJsZS4KCgojIFJlbGF0aXZlIEFidW5kYW5jZSBpbiBTYW1wbGVzIGF0IERpZmZlcmVudCBUYXhvbm9taWMgUmFua3MKIyMgMS4gQ2xhc3MKYGBge3IgY291bnRzX2MsIHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTZ9CmNvdW50c19jIDwtIGNvdW50c19ieV90YXhfcmFuayhkdDEgPSBvdHUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncl9ieSA9ICJDbGFzcyIpCnJhX2MgPC0gcmFfYnlfdGF4X3JhbmsoY291bnRzX2MpCgp0YXgucmFua3MgPC0gdW5pcXVlKG90dTFbLCBjKCJQaHlsdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbGFzcyIpXSkKCnJhX2MgPC0gbWVyZ2UodGF4LnJhbmtzLAogICAgICAgICAgICAgIHJhX2MsCiAgICAgICAgICAgICAgYnkgPSAiQ2xhc3MiKQoKdG90YWwgPC0gcm93U3VtcyhyYV9jWywgMzpuY29sKHJhX2MpXSkKCnJhX2MkQ2xhc3MgPC0gZmFjdG9yKHJhX2MkQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHJhX2MkQ2xhc3Nbb3JkZXIodG90YWwpXSkKCnJhX2MkUGh5bHVtIDwtIGZhY3RvcihyYV9jJFBoeWx1bSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHVuaXF1ZShyYV9jJFBoeWx1bVtvcmRlcih0b3RhbCldKSkKdG1wIDwtIG1lbHQuZGF0YS50YWJsZShkYXRhID0gcmFfYywKICAgICAgICAgICAgICAgICAgICAgICBpZC52YXJzID0gMToyLAogICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmUudmFycyA9IDM6bmNvbChjb3VudHNfYyksCiAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZSA9ICJTQU1QTEVfTkFNRSIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICJSQSIpCgp0bXAgPC0gbWVyZ2UoZGF0YS50YWJsZShTQU1QTEVfTkFNRSA9IHNhbXBsZXMkU0FNUExFX05BTUUsCiAgICAgICAgICAgICAgICAgICAgICAgIFdFRUsgPSBzYW1wbGVzJFdFRUssCiAgICAgICAgICAgICAgICAgICAgICAgIFRSRUFUTUVOVCA9IHNhbXBsZXMkVFJFQVRNRU5UKSwKICAgICAgICAgICAgIHRtcCwKICAgICAgICAgICAgIGJ5ID0gIlNBTVBMRV9OQU1FIikKCiMgUGxvdCBzYW1wbGVzCnAxIDwtIGdncGxvdCh0bXAsCiAgICAgICAgICAgICBhZXMoeCA9IFNBTVBMRV9OQU1FLAogICAgICAgICAgICAgICAgIHkgPSBSQSwKICAgICAgICAgICAgICAgICBmaWxsID0gQ2xhc3MsCiAgICAgICAgICAgICAgICAgY29sb3IgPSBQaHlsdW0pKSArCiAgZmFjZXRfd3JhcCh+IFdFRUsgKyBUUkVBVE1FTlQsCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZV94IiwKICAgICAgICAgICAgIG5yb3cgPSAzKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBzY2FsZV94X2Rpc2NyZXRlKCIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxKSkKZ2dwbG90bHkocDEpCmBgYAojIFNlc3Npb24gSW5mb3JtYXRpb24KYGBge3IgaW5mbyxldmFsPVRSVUV9CnNlc3Npb25JbmZvKCkKYGBg